package com.zxy.service.impl;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zxy.mapper.SysDeptMapper;
import com.zxy.pojo.dto.DeptQueryDTO;
import com.zxy.pojo.entity.SysDept;
import com.zxy.pojo.vo.SysDeptVO;
import com.zxy.service.SysDeptService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 部门Service实现类
 */
@Service
public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> implements SysDeptService {

    @Resource
    private SysDeptMapper sysDeptMapper;

    /**
     * 无分页查询部门树形列表（核心方法，返回纯列表）
     */
    @Override
    public List<SysDeptVO> getDeptTreeList(DeptQueryDTO query) {
        // 查询所有部门数据（无分页限制）
        List<SysDeptVO> allDepts = sysDeptMapper.selectDeptList(query);
        // 构建树形结构并返回
        return buildDeptTree(allDepts);
    }

    /**
     * 构建部门树形    树形结构
     */
    @Override
    public List<SysDeptVO> buildDeptTree(List<SysDeptVO> deptList) {
        // 筛选顶级部门（parentId=0）
        List<SysDeptVO> topDepts = deptList.stream()
                .filter(dept -> Objects.nonNull(dept.getParentId()) && Objects.equals(dept.getParentId(), 0L))
                .collect(Collectors.toList());

        // 为每个顶级部门设置子部门
        for (SysDeptVO topDept : topDepts) {
            setChildren(topDept, deptList);
        }

        return topDepts;
    }

    /**
     * 递归设置子部门
     */
    private void setChildren(SysDeptVO parentDept, List<SysDeptVO> allDepts) {
        Long parentId = parentDept.getDeptId();
        if (Objects.isNull(parentId)) {
            parentDept.setChildren(new ArrayList<>());
            return;
        }

        // 查找当前部门的所有子部门
        List<SysDeptVO> children = allDepts.stream()
                .filter(dept -> Objects.nonNull(dept.getParentId()) && Objects.equals(dept.getParentId(), parentId))
                .collect(Collectors.toList());

        if (!children.isEmpty()) {
            parentDept.setChildren(children);
            // 递归设置子部门的子部门
            for (SysDeptVO child : children) {
                setChildren(child, allDepts);
            }
        } else {
            parentDept.setChildren(new ArrayList<>());
        }
    }

    /**
     * 分页方法（保留但不使用，避免影响其他功能）
     */
    @Override
    public IPage<SysDeptVO> getDeptPage(DeptQueryDTO query) {
        Page<SysDeptVO> page = new Page<>(query.getPageNum(), query.getPageSize());
        IPage<SysDeptVO> deptPage = sysDeptMapper.selectDeptPage(page, query);
        deptPage.setRecords(buildDeptTree(deptPage.getRecords()));
        return deptPage;
    }
}

